/**
 * A和B两个多重集合，元素数量均为N（偶数）
 * 现在A和B都扔掉N/2个元素，要求剩下的元素种类最多，问最多是多少？
 * 首先在A和B中删除重复的元素，看A和B还剩多少种类，以及还要删除多少个。
 * 然后求出A和B交集的数量，根据A和B还要删除多少个分情况讨论
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;

int N;
int X, Y;
map<int, int> A, B;


void work(){
    A.clear();B.clear();
    cin >> N;
    cin >> X >> Y;
    for(int w,c,i=0;i<X;++i){
        cin >> w >> c;
        A[w] = c;
    }
    for(int w,c,i=0;i<Y;++i){
        cin >> w >> c;
        B[w] = c;
    }
    int need = N / 2;

    int na = 0;
    for(auto & p : A){
        na += p.second - 1;
        p.second = 1;
    }

    int nb = 0;
    for(auto & p : B){
        nb += p.second - 1;
        p.second = 1;
    }

    na = need - na;
    nb = need - nb;

    if(na < 0) na = 0;
    if(nb < 0) nb = 0;

    int c = 0;
    for(const auto & p : A){
        if(B.find(p.first) != B.end()){
            c += 1;
        }
    }

    int ans = A.size() + B.size() - c;
    if(na <= c){
        if(nb <= c){
            if(na + nb <= c){
                ;
            }else{
                auto t = na + nb - c;
                ans -= t;
            }  
        }else{
            ans = A.size() - na + B.size() - nb;
        }
    }else{
        if(nb <= c){
            ans = A.size() - na + B.size() - nb;
        }else{
            ans = A.size() - na + B.size() - nb;
        }
    }
    assert(ans > 0);
    cout << ans << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) work();
    return 0;
}
